# _*_ coding: UTF-8 _*_
# @Time     : 2021/10/27 14:01
# @Author   : 郑鲁明
# @Site     : http://www.hzdledu.cn/
# @File     : 面向对象程序设计.py
# @Software : PyCharm

# 类是对象的模板，是对象的抽象
# 对象是类的实例，是类的实例化

# class 类名：
#      属性
#      方法

class Dog:  # 类的首字母必须大写
    # 属性：静态特征
    # 1.类变量 2.对象变量/实例变量 3.局部变量
    class_name = "狗"  # 类变量，所有对象所公有的变量

    # 方法：动态特征
    # 构造方法：名字是固定的 __init__   ，作用是完成对象属性的初始化（构造对象）
    # 它在生成对象时自动调用，类中必有构造方法
    def __init__(self, name, color):
        self.name = name  # 对象变量：定义在方法中，以self.定义，作用域在整个类中
        self.color = color
        n = 10  # 局部变量：作用旨在方法内

    # 对象方法/实例方法：可以访问对象变量和类变量
    # self:当前对象   作为第一个对象的含义是把调用方法的对象作为当前对象
    def eat(self):
        print(f'{self.name}正在啃骨头')

    def bark(self):
        print('汪汪汪')

    # 类方法:只能访问类变量
    @classmethod
    def rename_class_name(cls, name):
        cls.class_name = name

    # 静态方法：只能访问局部变量
    @staticmethod
    def foo(x):
        print(x)


if __name__ == '__main__':
    # 根据类去生成对象
    # 对象名 = 类名（构造方法参数实例）
    xiaohuangdog = Dog('小黄', '黄色')
    xiaobaidog = Dog('小白', '黑色')

    # 调用对象的属性和方法
    print(Dog.class_name)  # 调用类变量
    print(xiaobaidog.name)  # 调用对象变量
    print(xiaohuangdog.color)  # 调用对象变量

    xiaohuangdog.eat()  # 调用对象方法
    xiaohuangdog.bark()  # 调用对象方法

